home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
-
- #define MAXOP 40
- #define NUMBER '0'
- #define STACKSIZE 40
-
- UBYTE sp;
- float stack[STACKSIZE];
-
- char s[MAXOP];
- UBYTE pos;
- float f;
-
- void push(float f)
- {
- if(sp < STACKSIZE)
- stack[sp++] = f;
- else
- puts("Stack full");
- }
-
- float pop()
- {
- if(sp > 0)
- return stack[--sp];
- else
- puts("Stack empty");
- return 0.0;
- }
-
- float top()
- {
- if(sp > 0)
- return stack[sp-1];
- else
- puts("Stack empty");
- return 0.0;
- }
-
- BYTE read_op()
- {
- if(pos == 0) {
- gets(s);
- }
-
- while(s[pos] == ' ' || s[pos] == '\t')
- pos++;
-
- if(s[pos] == '\0') {
- pos = 0;
- return('\n');
- }
-
- if(!isdigit(s[pos]))
- return(s[pos++]);
-
- f = s[pos] - '0';
- while(isdigit(s[++pos])) {
- BYTE i = s[pos] - '0';
- f = 10.0 * f;
- f += (float)i;
- }
- /* f = 10.0 * f + (float)(BYTE)(s[pos] - '0'); */
-
- return NUMBER;
- }
-
- void main()
- {
- BYTE type;
- float op2;
-
- puts("FP RPN Calculator");
- sp = 0;
- pos = 0;
-
- while((type = read_op(s)) != 0) {
- switch(type) {
- case NUMBER:
- push(f);
- break;
- case '+':
- push(pop() + pop());
- break;
- case '*':
- push(pop() * pop());
- break;
- case '-':
- op2 = pop();
- push(pop() - op2);
- break;
- case '/':
- op2 = pop();
- if(op2 != 0)
- push(pop() / op2);
- else
- puts("Divide by 0");
- break;
- case '\n':
- printf("==> %f\n", top());
- break;
- }
- }
- }
-